/*
 * ContextoPPMC.cpp
 *
 *  Created on: 28/04/2012
 *      Author: lucas
 */

#include "../hdr/ContextoPPMC.h"
#include <stdio.h>

#define ESC -1

ContextoPPMC::ContextoPPMC() {

}

int ContextoPPMC::emitirCaracter(unsigned char caracter) {
	unsigned int total = 0, probabilidad = 0;
	int resultado = 0; // = 0 si emite escape, sino = 1
	for (unsigned int i = 0; i < caracteres.getLargo(); i++) {
		total += frecuencias[i];
		if(caracteres[i] == caracter) {
			probabilidad = frecuencias[i];
			resultado = 1;
		}
		else if((caracteres[i] == ESC) && (probabilidad == 0))
			probabilidad = frecuencias[i];
	}
	if(probabilidad == 0) {
		probabilidad = 1;
		total = 1;
	}
	// Debug
	if(resultado == 0)
		printf("Emite escape (%c) con probabilidad %d/%d\n", caracter, probabilidad, total);
	else
		printf("Emite '%c' con probabilidad %d/%d\n", caracter, probabilidad, total);
	if(actualizarContexto(caracter) == -1)
		return -1;
	return resultado;
}

ContextoPPMC::~ContextoPPMC() {
	// TODO Auto-generated destructor stub
}

int ContextoPPMC::actualizarContexto(unsigned char caracter) {
	unsigned int posicion = 0;
	int posicionEscape = -1;
	while (posicion < caracteres.getLargo()) {
		if (caracteres[posicion] == caracter) {
			break;
		}
		if (caracteres[posicion] == ESC)
			posicionEscape = posicion;
		posicion++;
	}
	if (posicion == caracteres.getLargo()) {
		if (posicionEscape == -1) {
			if (caracteres.append(ESC) == -1)
				return -1;
			if (frecuencias.append(1) == -1)
				return -1;
		} else {
			frecuencias[posicionEscape]++;
		}
		if (caracteres.append(caracter) == -1)
			return -1;
		if (frecuencias.append(1) == -1)
			return -1;
	} else {
		frecuencias[posicion]++;
	}
	// Debug
	printf("Actualiza: %c\n", caracter);
	for (unsigned int i = 0; i < caracteres.getLargo(); i++) {
		printf("\t'%c':\t%d\n", caracteres[i], frecuencias[i]);
	}
	return 0;
}

